<?php namespace system\model;

use houdunwang\model\Model;

class Category extends Model
{

    //数据表
    protected $table = "category";

    //允许填充字段
    protected $allowFill = ['*'];

    //禁止填充字段
    protected $denyFill = [];

    //自动验证
    protected $validate = [//['字段名','验证方法','提示信息',验证条件,验证时间]
        ['cate_name', 'required', '栏目名称不能为空', self::MUST_VALIDATE, self::MODEL_BOTH],
        ['cate_description', 'required', '栏目描述不能为空', self::MUST_VALIDATE, self::MODEL_BOTH],
    ];

    //自动完成
    protected $auto = [//['字段名','处理方法','方法类型',验证条件,验证时机]
        ['cate_sort', 'intval', 'function', self::MUST_AUTO, self::MODEL_BOTH],
    ];

    //自动过滤
    protected $filter = [//[表单字段名,过滤条件,处理时间]
    ];

    //时间操作,需要表中存在created_at,updated_at字段
    protected $timestamps = true;

    /**
     * 获取栏目数据
     */
    public function getAllCate()
    {
        //return $this->get();
        //$this->get()->toArray()转为数组
        //数据空时给它默认空数据
        $res = $this->get() ? $this->get()->toArray() : [];
        return Arr::tree($res, 'cate_name', $fieldPri = 'cate_id', $fieldPid = 'cate_pid');
    }
    /**
     * 获取除了自己和自己子集之外的数据
     */
    public function getSonCateData($cate_id)
    {
        //1.递归找子集，
        $cids = $this->getSon($this->get()->toArray(), $cate_id);
        //2.把自己追加进去
        $cids[] = $cate_id;
        //3.把自己和子集数据踢出去
        $res = $this->get() ? $this->whereNotIn('cate_id', $cids)->get()->toArray() : [];
        //p($res);
        return Arr::tree($res, 'cate_name', 'cate_id', 'cate_pid');
    }

    /**
     * 递归找子集
     * @param $data                栏目所有数据
     * @param $cate_id            我们找$cate_id所有子集，栏目id
     */
    public function getSon($data, $cate_id)
    {
        //使用静态变量，不然每次调用自己的时候，$temp都是从空开始
        static $temp = [];
        foreach ($data as $k => $v) {
            if ($v['cate_pid'] == $cate_id) {
                //echo 1;
                //说明这条数据是我的儿子
                $temp[] = $v['cate_id'];//把找到的这条数据对应的cid存起来
                $this->getSon($data, $v['cate_id']);//接下来应该继续去找$v['cate_id'],它的子集数据
            }
        }
        return $temp;
    }
    //删除
    public function del($cate_id ){
        $model = Category::find($cate_id);
        if($this->where('cate_pid',$cate_id)->get()){
            $this->setError( ['请先删除子栏目'] );
            return false;
        }
        //删除当前的数据对象
        return $model->destory();
    }
}